#include <iostream>
#include <vector>
#include <fstream>
#include <omp.h>
//#include "kmp.cpp"
#include "sopa.hpp"
using namespace std;

//Variables Globales
sopaDeLetras *sopa;


void inicializar(vector<string>&);
void imprimeVector(vector<string>);


int main(){
	//**********bloque de variables**********
	//vector de palabras
	vector<string> palabras;
	char celda;
	int procesos_disponibles;
	int id_hilos;
	//**********bloque de variables**********

	inicializar(palabras);
	sopa->toUpper();
	cout<<"lista de palabras:"<<endl;
	imprimeVector(palabras);
	cout<<"sopa:"<<endl;
	sopa->imprime();
	//******* Fijo hilos segun disponibilidad *********//
	procesos_disponibles = omp_get_num_procs(); 
	omp_set_num_threads(procesos_disponibles);
	//******* Fijo hilos segun disponibilidad *********//

	printf("Hilos disponibles: %d\n", procesos_disponibles);
	//nucleo del programa
	#pragma omp parallel for //Paralelizo ciclo for
	for(int i=0;i<sopa->getW();i++){
		//id_hilos = omp_get_thread_num();
		//printf("Usando hilo: %d\n", id_hilos);
		for(int j=0;j<sopa->getH();j++){
			celda = sopa->buscarRelativo(i,j,0,1);
			for (vector<string>::iterator k = palabras.begin();k!=palabras.end();k++){
				if((*k)[0]==celda){
					//Hasta aqui se encontro que la celda coincide con la 1era letra de la palabra
					//For de direccion
					for(int l=1;l<9;l++){
						//for en profundidad
						for(int m=1;m<(*k).length();m++){
							if(sopa->buscarRelativo(i,j,m,l) != (*k)[m])break;
							if(m == (*k).length()-1)cout<<"ENCONTRADO:"<<*k<<". posicion:"<<i<<","<< j<<"direccion:"<<l<<endl;
						}
					}
				}
			}
		}

	}



}

	


void inicializar(vector<string> &palabras){
	
	//Lectura de la lista de palabras
	ifstream pal("ejemplos/palabras4");
	string p;
	while(pal>>p){
		for(int i=0;i<p.length();i++)p[i]=toupper(p[i]);
		palabras.push_back(p);
	}
	//Se abre el archivo que contiene la sopa
	ifstream entrada("ejemplos/sopa4");
	sopa = new sopaDeLetras(entrada);

}

void imprimeVector(vector<string> v){
	for (vector<string>::iterator i = v.begin();i!=v.end();i++){
		cout<<*i<<endl;
	}
}
